///////////////////////////////////////////////////////////////////////////////
// File:        Sha1.cc
// Author:      671643387@qq.com
// Description:
///////////////////////////////////////////////////////////////////////////////

#include "auth/Sha1.hpp"
#include "auth/BigNumber.hpp"
#include <cstdarg>

///////////////////////////////////////////////////////////////////////////////

Sha1Hash::Sha1Hash(void)
{
    SHA1_Init(&mC_);
}

Sha1Hash::~Sha1Hash(void)
{
    SHA1_Init(&mC_);
}

///////////////////////////////////////////////////////////////////////////////

void Sha1Hash::Initialize(void)
{
    SHA1_Init(&mC_);
}

void Sha1Hash::Finalize(void)
{
    SHA1_Final(mDigest, &mC_);
}

///////////////////////////////////////////////////////////////////////////////

void Sha1Hash::UpdateData(const uint8_t* dat, std::size_t len)
{
    SHA1_Update(&mC_, (const void*)dat, len);
}

void Sha1Hash::UpdateData(const std::string& str)
{
    UpdateData((const uint8_t*)str.c_str(), str.length());
}

void Sha1Hash::UpdateBigNumbers(BigNumber* x, ...)
{
    std::va_list v;
    BigNumber* bn;

    va_start(v, x);
    bn = x;
    while (bn)
    {
        UpdateData(bn->AsByteArray(), bn->GetNumBytes());
        bn = va_arg(v, BigNumber*);
    }
    va_end(v);
}